package org.xiaog.fastdao.util;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author xiaog
 */
public class SqlUtil {

    public static void insert(SqlParser parser,EntityMeta meta,Object entity) {
        EntityMeta.DynamicEntity dynamic = EntityMeta.getNotNullColumns(entity);
        List<String> columns = new ArrayList<>(dynamic.getOtherCol());
        List<Object> values = new ArrayList<>(dynamic.getOtherVal());
        if (dynamic.getIdVal() != null) {
            columns.add(dynamic.getIdCol());
            values.add(dynamic.getIdVal());
        }
        StringBuilder sql = new StringBuilder("insert into ");
        sql.append(meta.getTableName()).append("(").append(String.join(", ",columns))
        .append(") values (").append(getMark(columns.size())).append(")");
        parser.setSql(sql.toString());
        parser.setArgs(values.toArray());
    }

    public static void updateById(SqlParser parser,EntityMeta meta,Object entity) {
        EntityMeta.DynamicEntity dynamic = EntityMeta.getNotNullColumns(entity);
        List<String> columns = new ArrayList<>(dynamic.getOtherCol());
        List<Object> values = new ArrayList<>(dynamic.getOtherVal());
        StringBuilder sql = new StringBuilder("update ");
        sql.append(meta.getTableName()).append(" set ");
        String set = columns.stream().map(x -> x + " = ?").collect(Collectors.joining(","));
        sql.append(set).append(" where ").append(dynamic.getIdCol()).append(" = ?");
        parser.setSql(sql.toString());
        values.add(dynamic.getIdVal());
        parser.setArgs(values.toArray());
    }

    public static String getDeleteByIdSql(EntityMeta meta) {
        StringBuilder sql = new StringBuilder("delete from ");
        sql.append(meta.getTableName()).append(" where ").append(meta.getIdColumn()).append(" = ?");
        return sql.toString();
    }

    public static String getGetByIdSql(EntityMeta meta) {
        StringBuilder sql = new StringBuilder("select ");
        List<String> columns = new ArrayList<>(meta.getColumns().size()+1);
        columns.add(meta.getIdColumn());
        columns.addAll(meta.getColumns());
        sql.append(String.join(",", columns))
                .append(" from ").append(meta.getTableName())
                .append(" where ").append(meta.getIdColumn()).append(" = ?");
        return sql.toString();
    }

    public static String getGetByIdsSql(EntityMeta meta,int size) {
        StringBuilder sql = new StringBuilder("select ");
        List<String> columns = new ArrayList<>(meta.getColumns().size()+1);
        columns.add(meta.getIdColumn());
        columns.addAll(meta.getColumns());
        sql.append(String.join(",", columns))
                .append(" from ").append(meta.getTableName())
                .append(" where ").append(meta.getIdColumn()).append(" in (")
                .append(getMark(size)).append(")");
        return sql.toString();
    }

    private static String getMark(int length) {
        List<String> list = new ArrayList<>(length);
        for (int i = 0; i < length; i++) {
            list.add("?");
        }
        return String.join(", ", list);
    }

}
